package com.bizmerce.rnd.oms.decision;

import com.bizmerce.rnd.oms.decision.criterion.BuildDownMethod;
import com.bizmerce.rnd.oms.decision.criterion.BuildUpMethod;
import com.bizmerce.rnd.oms.decision.criterion.CCCriterion;
import com.bizmerce.rnd.oms.decision.criterion.CTHCriterion;
import com.bizmerce.rnd.oms.decision.criterion.CTSHCriterion;
import com.bizmerce.rnd.oms.decision.criterion.Criterion;
import com.bizmerce.rnd.oms.decision.criterion.NetCostMethod;
import com.bizmerce.rnd.oms.decision.criterion.iMportContents;
import com.bizmerce.rnd.oms.decision.data.DeMinimis;
import com.bizmerce.rnd.oms.decision.data.PsrCriterion;

/**
 * 품목에 맞는 적용기준을 관리하는 클래스
 * @author Gyeseon
 *
 */
public class CriterionManager {
	
	/**
	 * TODO 완화기준을 넣어주는 방법이 아주 어색하다.
	 *      품목에 대해서 모든 기준을 통으로 가지고 있을 수 있는 객체가 필요하다.
	 * @param psrCriterion
	 * @param deMinimis
	 * @return
	 */
	public Criterion getCreterion(PsrCriterion psrCriterion, DeMinimis deMinimis) {
		String rule = psrCriterion.getRule();
		Criterion criterion = null;
		if(rule.equals(PsrCriterion.CC)) {
			criterion = new CCCriterion();
			if(deMinimis.getAvailableRate() > 0) {
				criterion.addRelaxRule(new com.bizmerce.rnd.oms.decision.criterion.relax.DeMinimis());
			}
		} else if(rule.equals(PsrCriterion.CTH)) {
			criterion = new CTHCriterion();
			if(deMinimis.getAvailableRate() > 0) {
				criterion.addRelaxRule(new com.bizmerce.rnd.oms.decision.criterion.relax.DeMinimis());
			}
		} else if(rule.equals(PsrCriterion.CTSH)) {
			criterion = new CTSHCriterion();
			if(deMinimis.getAvailableRate() > 0) {
				criterion.addRelaxRule(new com.bizmerce.rnd.oms.decision.criterion.relax.DeMinimis());
			}
		} else if(rule.equals(PsrCriterion.BD)) {
			criterion = new BuildUpMethod();
		} else if(rule.equals(PsrCriterion.BU)) {
			criterion = new BuildDownMethod();
		} else if(rule.equals(PsrCriterion.MC)) {
			criterion = new iMportContents();
		} else if(rule.equals(PsrCriterion.NC)) {
			criterion = new NetCostMethod();
		}
		
		//TODO 복합룰의 경우 어떻게 룰을 생성하여 리턴할 것인가? 
		//     복합Criterion 클래스를 만들어 여러개의 룰을 등록하고 모두 만족하면 성하는 assign메소드를 구현한다.
		return criterion;
	}
}
